package com.songxh.core.utils;

import com.songxh.core.shared.constant.RedisConsts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis 工具类
 *
 * @author songxh
 * @create 2022-12-29-11:16
 */
@Component
public class RedisUtils {
    private static RedisTemplate redisTemplate;

    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisUtils.redisTemplate = redisTemplate;
    }

    /**
     * 添加redis缓存
     *
     * @param key
     * @param value
     * @param expireSecond 过期时间
     */
    public static void set(String key, Object value, int expireSecond) {
        redisTemplate.boundValueOps(key).set(value, expireSecond, TimeUnit.SECONDS);
    }

    public static void set(String key, Object value) {
        set(key, value, RedisConsts.DEFAULT_EXPIRE_TIME_SECONDS);
    }

    /**
     * 根据key获取指定类型的数据
     *
     * @param key
     * @param tClass
     * @param <T>    返回值类型
     * @return
     */
    public static <T> T get(String key, Class<T> tClass) {
        return (T) redisTemplate.boundValueOps(key).get();
    }

    /**
     * 给key所对应的value值增长指定数量
     *
     * @param key
     * @param num
     */
    public static void increment(String key, Long num) {
        redisTemplate.boundValueOps(key).increment(num);
    }

    /**
     * 给指定key的value减去指定数量
     *
     * @param key
     * @param num
     */
    public static void decrement(String key, Long num) {
        redisTemplate.boundValueOps(key).decrement(num);
    }

    public static void deleteByKey(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 给健为key的数据中健为hashkey的键值对赋值
     *
     * @param key
     * @param hashKey
     * @param value   此处为点赞数设计，指定为Long类型
     */
    public static void setHash(String key, String hashKey, Long value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }

    /**
     * 给指定key的的指定hash的value减去指定数量
     *
     * @param key
     * @param num
     */
    public static void incrementHash(String key, String hashKey, Long num) {
        redisTemplate.opsForHash().increment(key, hashKey, num);
    }

    /**
     * 根据key获取hash指定key的值
     *
     * @param key
     * @param tClass
     * @param <T>    返回值类型
     * @return
     */
    public static <T> T getHash(String key, String hashKey, Class<T> tClass) {
        return (T) redisTemplate.opsForHash().get(key, hashKey);
    }

    /**
     * 获取所有hash的key
     *
     * @param key
     * @return
     */
    public static Set getHashKey(String key) {
        return redisTemplate.opsForHash().keys(key);
    }

    /**
     * 删除hash类型数据中指定的key的数据
     *
     * @param key
     * @param hashKey
     */
    public static void deleteHash(String key, String hashKey) {
        redisTemplate.opsForHash().delete(key, hashKey);
    }

}
